{
 "nbformat": 4,
 "nbformat_minor": 0,
 "metadata": {
  "colab": {
   "provenance": [
    {
     "file_id": "1gY21zoxC6jiGemXQ2qPRVwdtzLe9YbV7",
     "timestamp": 1716864570918
    }
   ],
   "gpuType": "A100",
   "authorship_tag": "ABX9TyMTrG4j/SW/iA4br8NJ79HO"
  },
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3"
  },
  "language_info": {
   "name": "python"
  },
  "accelerator": "GPU"
 },
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "##### Copyright 2024 Google LLC."
   ],
   "metadata": {
    "id": "h7W3Nhq8Cpnv"
   }
  },
  {
   "cell_type": "code",
   "source": [
    "# @title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    "# you may not use this file except in compliance with the License.\n",
    "# You may obtain a copy of the License at\n",
    "#\n",
    "# https://www.apache.org/licenses/LICENSE-2.0\n",
    "#\n",
    "# Unless required by applicable law or agreed to in writing, software\n",
    "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "# See the License for the specific language governing permissions and\n",
    "# limitations under the License."
   ],
   "metadata": {
    "cellView": "form",
    "id": "TinKT_mJCsxf"
   },
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Gemma - Translator of Old Korean Literature\n",
    "\n",
    "The Korean alphabet, or Hangul, has undergone changes over time, resulting in several letters no longer used in modern Korean. These obsolete letters include:\n",
    "\n",
    "1. ㆍ (Arae-a): This dot vowel represents a short 'a' sound.\n",
    "2. ㆆ (Yeorin-hieut): Pronounced as a 'light h,' akin to a softer version of the English 'h.'\n",
    "3. ㅿ (Bansiot): Represents the 'z' sound.\n",
    "4. ㆁ (Yet-ieung): A velar nasal sound comparable to 'ng' in the word 'sing.'\n",
    "\n",
    "For native Korean speakers, reading older literature presents a challenge due to the utilization of now-obsolete letters. Early Hangul lacked spaces between words, further complicating readability. In contrast, modern Hangul employs spaces, consistent with most alphabetic systems.\n",
    "\n",
    "However, with the capabilities provided by Gemma, it becomes possible to create a translator that can aid in understanding and bridging the gap between contemporary and archaic Korean.\n",
    "\n",
    "<table align=\"left\">\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/google-gemini/gemma-cookbook/blob/main/Gemma/Translator_of_Old_Korean_Literature.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",
    "  </td>\n",
    "</table>"
   ],
   "metadata": {
    "id": "o3z5WeA7CvId"
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Setup\n",
    "\n",
    "### Select the Colab runtime\n",
    "To complete this tutorial, you'll need to have a Colab runtime with sufficient resources to run the Gemma model:\n",
    "\n",
    "1. In the upper-right of the Colab window, select **▾ (Additional connection options)**.\n",
    "2. Select **Change runtime type**.\n",
    "3. Under **Hardware accelerator**, select **A100 GPU**.\n",
    "\n",
    "\n",
    "### Gemma setup on Kaggle\n",
    "To complete this tutorial, you'll first need to complete the setup instructions at [Gemma setup](https://ai.google.dev/gemma/docs/setup). The Gemma setup instructions show you how to do the following:\n",
    "\n",
    "* Get access to Gemma on kaggle.com.\n",
    "* Select a Colab runtime with sufficient resources to run the Gemma 2B model.\n",
    "* Generate and configure a Kaggle username and API key.\n",
    "\n",
    "After you've completed the Gemma setup, move on to the next section, where you'll set environment variables for your Colab environment."
   ],
   "metadata": {
    "id": "xNW5xe6H-pjx"
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### Set environment variables\n",
    "\n",
    "Set environment variables for `KAGGLE_USERNAME` and `KAGGLE_KEY`."
   ],
   "metadata": {
    "id": "_-wBeyQSDkCG"
   }
  },
  {
   "cell_type": "code",
   "source": [
    "import os\n",
    "from google.colab import userdata, drive\n",
    "\n",
    "# Note: `userdata.get` is a Colab API. If you're not using Colab, set the env\n",
    "# vars as appropriate for your system.\n",
    "os.environ[\"KAGGLE_USERNAME\"] = userdata.get(\"KAGGLE_USERNAME\")\n",
    "os.environ[\"KAGGLE_KEY\"] = userdata.get(\"KAGGLE_KEY\")\n",
    "\n",
    "# Mounting gDrive for to store artifacts\n",
    "drive.mount(\"/content/drive\")"
   ],
   "metadata": {
    "id": "KM03mq1eDlPq"
   },
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "source": [
    "### Install dependencies\n",
    "\n",
    "Install Keras and KerasNLP."
   ],
   "metadata": {
    "id": "D9iAtD0MD2Nw"
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "ttUGCQLS-SbC"
   },
   "outputs": [],
   "source": [
    "# Install Keras 3 last. See https://keras.io/getting_started/ for more details.\n",
    "!pip install -q -U keras-nlp datasets\n",
    "!pip install -q -U keras\n",
    "\n",
    "os.environ[\"KERAS_BACKEND\"] = \"tensorflow\"  # \"jax\" Or \"torch\" or \"tensorflow\".\n",
    "\n",
    "# Training Configurations\n",
    "lora_name = \"translator\"\n",
    "lora_rank = 8\n",
    "lr_value = 1e-4"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Load Dataset"
   ],
   "metadata": {
    "id": "dJuLO9SF-5sY"
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "We've prepared [the dataset](https://huggingface.co/datasets/bebechien/HongGildongJeon) from Hong Gildong jeon (Korean: 홍길동전), which is a Korean novel written during the Joseon Dynasty. The [original source](https://ko.wikisource.org/wiki/%ED%99%8D%EA%B8%B8%EB%8F%99%EC%A0%84_36%EC%9E%A5_%EC%99%84%ED%8C%90%EB%B3%B8) is in public domain. We used a [modern translation](https://ko.wikisource.org/wiki/%ED%99%8D%EA%B8%B8%EB%8F%99%EC%A0%84_36%EC%9E%A5_%EC%99%84%ED%8C%90%EB%B3%B8/%ED%98%84%EB%8C%80%EC%96%B4_%ED%95%B4%EC%84%9D) in a [creative commons license](https://creativecommons.org/licenses/by-sa/4.0/), translated by `직지프로`.\n",
    "\n",
    "To simplify the task, we will adopt the following structure for fine-tuning the model. The model will generate contemporary Korean text based on the user's input in Early Hangul.\n",
    "\n",
    "```\n",
    "<start_of_turn>user\\n\n",
    "됴션국셰둉ᄃᆡ왕즉위십오연의홍희문밧긔ᄒᆞᆫᄌᆡ상이잇스되\n",
    "<end_of_turn>\\n\n",
    "<start_of_turn>model\\n\n",
    "조선국 세종대왕 즉위 십오년에 홍회문 밖에 한 재상이 있으되,\n",
    "```\n",
    "\n",
    "> NOTE: korean text means, In the fifteenth year of the reign of King Sejong of Joseon, there was a prime minister outside Honghoemun Gate.\n"
   ],
   "metadata": {
    "id": "eQZ3FuAFESRd"
   }
  },
  {
   "cell_type": "code",
   "source": [
    "import keras_nlp\n",
    "\n",
    "tokenizer = keras_nlp.models.GemmaTokenizer.from_preset(\"gemma_instruct_2b_en\")\n",
    "\n",
    "from datasets import load_dataset\n",
    "\n",
    "ds = load_dataset(\n",
    "    \"bebechien/HongGildongJeon\",\n",
    "    split=\"train\",\n",
    ")\n",
    "print(ds)\n",
    "data = ds.with_format(\n",
    "    \"np\", columns=[\"original\", \"modern translation\"], output_all_columns=False\n",
    ")\n",
    "train = []\n",
    "max_token_len = 0\n",
    "\n",
    "for x in data:\n",
    "    item = f\"<start_of_turn>user\\n{x['original']}<end_of_turn>\\n<start_of_turn>model\\n{x['modern translation']}\"\n",
    "    train.append(item)\n",
    "    length = tokenizer(item).get_shape().as_list()[0]\n",
    "    if length > max_token_len:\n",
    "        max_token_len = length\n",
    "        print(f\"longest toekn {max_token_len} - {item}\")\n",
    "\n",
    "print(train[0])\n",
    "print(train[1])\n",
    "print(train[2])\n",
    "\n",
    "print(max_token_len)"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "ATGYi1g6-7cd",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1713147317160,
     "user_tz": -540,
     "elapsed": 7646,
     "user": {
      "displayName": "Ju-yeong Ji",
      "userId": "07739812480064137731"
     }
    },
    "outputId": "18d166cf-e48e-41a6-e5e2-3b833c5b908f"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stderr",
     "text": [
      "/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_token.py:88: UserWarning: \n",
      "The secret `HF_TOKEN` does not exist in your Colab secrets.\n",
      "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n",
      "You will be able to reuse this secret in all of your notebooks.\n",
      "Please note that authentication is recommended but still optional to access public models or datasets.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Dataset({\n",
      "    features: ['original', 'modern translation'],\n",
      "    num_rows: 447\n",
      "})\n",
      "longest toekn 383 - <start_of_turn>user\n",
      "됴션국셰둉ᄃᆡ왕즉위십오연의홍희문밧긔ᄒᆞᆫᄌᆡ상이잇스되셩은홍이요명은문이니위인이쳥염강직ᄒᆞ여덩망이거록ᄒᆞ니당셰의영웅이라일직용문의올나벼살이할림의쳐ᄒᆞ엿더니명망이됴졍의읏듬되ᄆᆡ젼하그덕망을승이녀긔ᄉᆞ벼살을도도와이조판셔로좌으졍을ᄒᆞ이시니승상이국은을감동ᄒᆞ야갈츙보국ᄒᆞ니ᄉᆞ방의일이업고도젹이업스ᄆᆡ시화연풍ᄒᆞ여나라이ᄐᆡ평ᄒᆞ더라<end_of_turn>\n",
      "<start_of_turn>model\n",
      "조선국 세종대왕 즉위 십오년에 홍회문 밖에 한 재상이 있으되, 성은 홍이요, 명은 문이니, 위인이 청렴강직하여 덕망이 거룩하니 당세의 영웅이라. 일찍 용문에 올라 벼슬이 한림에 처하였더니 명망이 조정의 으뜸 되매, 전하 그 덕망을 승히 여기사 벼슬을 돋우어 이조판서로 좌의정을 하게 하시니, 승상이 국은을 감동하여 갈충보국하니 사방에 일이 업고 도적이 없으매 시화연풍하여 나라가 태평하더라.\n",
      "longest toekn 1173 - <start_of_turn>user\n",
      "일일은승상난간의비겨잠ᄀᆞᆫ조의더니ᄒᆞᆫ풍이긜을인도ᄒᆞ여ᄒᆞᆫ고듸다다르니쳥산은암암ᄒᆞ고녹슈난양양ᄒᆞᆫ듸셰류쳔만ᄀᆞ지녹음이파ᄉᆞᄒᆞ고황금갓ᄐᆞᆫᄭᅬᄭᅩ리난춘흥을희롱ᄒᆞ여냥뉴간의왕ᄂᆡᄒᆞ며긔화요초만발ᄒᆞᆫᄃᆡ쳥학ᄇᆡᆨ학이며비취공작이춘광을ᄌᆞ랑ᄒᆞ거날승상이경물을귀경ᄒᆞ며졈졈드러가니만쟝졀벽은하날의다엇고구뷔구뷔벽계슈난골골이폭포되어오운이어러엿난ᄃᆡ길이ᄭᅳᆫ쳐갈바을모로더니문득쳥용이물결을혜치고머리을드러고함ᄒᆞ니산학이믄허지난듯ᄒᆞ더니그용이입을버리고긔운을토ᄒᆞ여승상의입으로드러뵈거날ᄭᆡ다르니평ᄉᆡᆼᄃᆡ몽이라ᄂᆡ염의혜아리되피련군ᄌᆞ을나희리라ᄒᆞ여즉시ᄂᆡ당의드러ᄀᆞ시비을믈이치고부인을익그러취침코져ᄒᆞ니부인이졍ᄉᆡᆨ왈승상은국지ᄌᆡ상이라쳬위존즁ᄒᆞ시거날ᄇᆡᆨ쥬의졍실의드러와노류장화갓치ᄒᆞ시니ᄌᆡ상의쳬면이어ᄃᆡ잇난잇ᄀᆞ승상이ᄉᆡᆼ각ᄒᆞ신직말ᄉᆞᆷ은당연ᄒᆞ오나ᄃᆡ몽을허송할가ᄒᆞ야몽ᄉᆞ을이르지아니ᄒᆞ지고연ᄒᆞ여간쳥ᄒᆞ시니부인이옷슬ᄯᅥᆯ치고밧그로나가시니승상이무류ᄒᆞ신즁의부인의도도ᄒᆞᆫ고집을ᄋᆡ달나무슈히ᄎᆞ탄ᄒᆞ시고외당으로나오시니마ᄎᆞᆷ시비춘셤이상을드리거날좌우고요ᄒᆞ믈인ᄒᆞ여춘셤을잇글고원앙지낙을일의시니져긔울화을더르시나심ᄂᆡ의못ᄂᆡ한탄ᄒᆞ시더라<end_of_turn>\n",
      "<start_of_turn>model\n",
      "일일은 승상 난간에 비겨 잠깐 졸더니, 한풍이 길을 인도하여 한 곳에 다다르니, 청산은 암암하고 녹수는 양양한데 세류 천만 가지 녹음이 파사하고, 황금 같은 꾀꼬리는 춘흥을 희롱하여 양류간에 왕래하며 기화요초 만발한데, 청학 백학이며 비취 공작이 춘광을 자랑하거늘, 승상이 경물을 구경하며 점점 들어가니, 만장절벽은 하늘에 닿았고, 굽이굽이 벽계수는 골골이 폭포되어 오운이 어리었는데, 길이 끊어져 갈 바를 모르더니, 문득 청룡이 물결을 헤치고 머리를 들어 고함 하니 산학이 무너지는 듯하더니, 그 용이 입을 벌리고 기운을 토하여 승상의 입으로 들어오거늘, 깨달으니 평생 대몽이라.\n",
      "내염에 헤아리되 \"필연 군자를 낳으리라.\" 하여, 즉시 내당에 들어가 시비를 물리치고 부인을 이끌어 취침코자 하니, 부인이 정색 왈,\n",
      "\"승상은 국지재상이라, 체위 존중하시거늘 백주에 정실에 들어와 노류장화같이 하시니 재상의 체면이 어디에 있나이까?\"\n",
      "승상이 생각하신 즉, 말씀은 당연하오나 대몽을 허송할까 하여 몽사를 이르지 아니하시고 연하여 간청하시니, 부인이 옷을 떨치고 밖으로 나가시니, 승상이 무료하신 중에 부인의 도도한 고집을 애달아 무수히 차탄하시고 외당으로 나오시니, 마침 시비 춘섬이 상을 드리거늘, 좌우 고요함을 인하여 춘섬을 이끌고 원앙지낙을 이루시니 적이 울화를 덜으시나 심내에 못내 한탄하시더라.\n",
      "longest toekn 1196 - <start_of_turn>user\n",
      "그방셔의ᄒᆞ여시되대범ᄉᆞᄅᆞᆷ이복ᄌᆡ지한의나ᄆᆡ오륜이이스니오륜즁의군뷔읏믐이라ᄉᆞᄅᆞᆷ되고오륜을바리면ᄉᆞᄅᆞᆷ이아니라ᄒᆞᄂᆞ니이졔너ᄂᆞᆫ지혜와식견이범ᄉᆞᄅᆞᆷ두곤더ᄒᆞ되이ᄅᆞᆯ모로니엇지ᄋᆡ답지아니ᄒᆞ리요우리셰ᄃᆡ로국은을입어ᄌᆞᄌᆞ손손히녹을바드니망극ᄒᆞᆫ마음이갈츙보국ᄒᆞ더니우리의게밋쳐ᄂᆞᆫ널노말무야마역명을장ᄎᆞ어ᄂᆡ곳듸밋츨쥴모로게되니엇지ᄒᆞᆫ심타ᄲᅮᆫ이며난신과젹ᄌᆞ어ᄂᆡᄃᆡ의업스리요마난우리문호의셔날쥴은진실노ᄯᅳᆺᄒᆞ지못ᄒᆞ엿도다네의죄목을젼하진로ᄒᆞ시니맛당이극형을ᄒᆡᆼᄒᆞ실거시로듸ᄀᆞ지록성은이망극ᄒᆞᄉᆞ죄를더ᄒᆞ지아니ᄒᆞ시고날을명ᄒᆞᄉᆞ너을ᄌᆞ부라ᄒᆞ옵시니망극ᄒᆞᆫ마음도로혀황공ᄒᆞ며팔십노친이ᄇᆡᆨ슈모년의널노ᄒᆞ야곰쥬야우려ᄒᆞ시던즁의네이럿탓변괴을지어죄을나ᄅᆞ의어드니놀ᄂᆡ신마음이병이되여이졔눕고장ᄎᆞ이지못ᄒᆞ게되시니부친만일널노인ᄒᆞ야셰상을ᄇᆞ리시면네ᄉᆞᄅᆞ셔도녁명을입고쥭어지ᄒᆞ의간들쳔츄만ᄃᆡ예블츙블효지죄ᄅᆞᆯ유전ᄒᆞᆯ지라ᄯᅩᄒᆞᆫ그나문우리일문이원통치아니ᄒᆞᆯ야네엇지넉넉ᄒᆞᆫ소견으로이ᄅᆞᆯᄉᆡᆼ각지못ᄒᆞᄂᆞ냐네이죄명을ᄀᆞ지고셰상의용납할진ᄃᆡᄉᆞᄅᆞᆷ읜비록안셔ᄒᆞᄂᆞ소소ᄒᆞᆫ쳔벌이ᄉᆞ졍이잇스랴이졔맛당히쳔명을슌슈ᄒᆞ야조졍쳐분을지달일ᄲᅮᆫ이니ᄯᅩ엇지ᄒᆞ리요네일즉도라오긔을ᄇᆞᄅᆡ노라ᄒᆞ엿더라<end_of_turn>\n",
      "<start_of_turn>model\n",
      "그 방서에 하였으되,\n",
      "\"대법 사람이 복재지간에 나매 오륜 있으니 오륜중에 군부가 으뜸이라. 사람되고 오륜을 버리면 사람이 아니라 하나니, 이제 너는 지혜와 식견이 범 사람보다 더하되 이를 모르니 어찌 애닯지 아니하리요? 우리 세대로 국은을 입어 자자손손이 녹을 받으니 망극한 마음이 갈충보국하더니, 우리에게 미쳐서는 너로 말미암아 역명을 장차 어느 곳에 미칠 줄 모르게 되니 어찌 한심하다 뿐이며, 난신과 적자 어느 대에 없으리요마는 우리 문호에서 날 줄은 진실로 뜻하지 못하였도다. 너의 죄목을 전하 진로하시니 마땅히 극형을 행하실 것 이로되, 갈수록 성은이 망극하사 죄를 더하지 아니하시고 나를 명하사 너를 잡으라 하옵시너 망극한 마음 도리어 황공하며, 팔십 노친이 백수모년에 너로 하여금 주야 우려하시던 중에 네 이렇듯 변괴를 지어 죄를 나라에 얻으니 놀라신 마음에 병이 되어 이제 눕고 장차 일어나지 못하게 되시니, 부친 만일 너로 인하여 세상을 버리시면 네 살아서도 역명을 입고, 죽어 지하에 간들 천추만대에 볼충볼효지죄를 유전할지라. 또한 그 남은 우리 일문이 원통치 아니하랴? 네 어찌 넉넉한 소견으로 이를 생각지 못하느냐? 네 이 죄명을 가지고 세상에 용납할진대 사람은 비록 안서하나 소소한 천벌이 사정이 있으랴? 이제 마땅히 천명을 순수하여 조정의 처분을 기다릴 뿐이니 또 어찌하리요? 네 일찍 돌아오기를 바라노라.\"\n",
      "하였더라.\n",
      "longest toekn 1252 - <start_of_turn>user\n",
      "길동이ᄯᅩᄒᆞᆫ신쟝을분부왈ᄂᆡ몸이조졍의쳐ᄒᆞ여법을ᄌᆞᄇᆞ시면몬쳠불법을업셰여각도ᄉᆞ찰을훼ᄑᆡᄒᆞ렷더니이졔오ᄅᆡ지아니ᄒᆞ여조션국을ᄯᅥ날지라그러ᄒᆞ나부모국이라만리타국의잇셔도잇지못ᄒᆞᆯ지라이졔로각ᄉᆞ의ᄀᆞ혹셰무민ᄒᆞᄂᆞᆫ즁놈을일졔이ᄌᆞᄇᆞ오고ᄯᅩᄒᆞᆫ장안ᄌᆡ상ᄀᆞ의ᄌᆞ식이셰ᄅᆞᆯᄭᅵ고고잔ᄒᆞᆫᄇᆡᆨ셩을소겨ᄌᆡ믈을취ᄒᆞ고블의ᄒᆞᆫ일이만ᄒᆞ며마음이교만ᄒᆞ되구즁이집퍼쳔일이복분의빗초오지못ᄒᆞ고간신이나라의좀미되여셩상의총명을ᄀᆞ리우니ᄀᆞ히ᄒᆞᆫ심ᄒᆞᆫ일이허다ᄒᆞᆫ지라장안의호당지도을낫낫치ᄌᆞᄇᆞ드리라ᄒᆞ니신장이명을듯고공즁으로나라ᄀᆞ더니이시ᄒᆞᆫ후의즁놈ᄇᆡᆨ여명과경화ᄌᆞ졔십여인을ᄌᆞᄇᆞ드리ᄂᆞᆫ지라길동이위염을베플고호령을놉펴각각슈죄왈너희ᄂᆞᆫ다시셰상을보지못ᄒᆞ게ᄒᆞᆯ터이로듸ᄂᆡ몸이나라의조명을ᄇᆞ다국법을ᄌᆞ분ᄇᆡ아니긔로고위안셔ᄒᆞ거니와일후의만일고치지아니ᄒᆞ면너희비록슈만리밧긔잇셔도ᄌᆞᄇᆞ다가버히리라ᄒᆞ고엄형일ᄎᆞ의진문밧긔ᄂᆡ치니라길동이우양을ᄌᆞᄇᆞ군ᄉᆞ을호궤ᄒᆞ고진용을졍졔ᄒᆞ야훤화을금단ᄒᆞ니창쳔만리의ᄇᆡᆨ일이고욕ᄒᆞ고팔진풍운의호령이엄슉ᄒᆞᆫ지라길동이슐을나소와반취ᄒᆞᆫ후의칼을ᄌᆞᄇᆞ츔을츄니검광이분분ᄒᆞ야ᄒᆡ빗츨희롱ᄒᆞ고무슈ᄂᆞᆫ표표ᄒᆞ야공즁의날니ᄂᆞᆫ지라일지셕의라진셰을ᄑᆞᄒᆞ야신장을각각도라보ᄂᆡ고몸을날여활빈당쳐소로도라오니라<end_of_turn>\n",
      "<start_of_turn>model\n",
      "길동이 또 한 신장을 분부 왈,\n",
      "\"내 몸이 조정에 처하여 법을 잡았으면 먼저 불법을 없애어 각도 사찰을 훼패하렸더니, 이제 오래지 아니하여 조선국을 떠날지라. 그러하나 부모국이라 만리타국에 있어도 잊지 못할지라. 이제로 각 사에 가 혹세무민하는 중놈을 일제히 잡아고고, 또한 재상가의 자식이 세를 끼고 고잔한 백성을 속여 재물을 취하고, 불의한 일이 많으며 마음이 교만하되 구중이 깊어 천일이 복분에 비추오지 못하고, 간신이 나라의 좀이 되어 성상의 총명을 가리우니 가히 한심한 일이 허다한지라. 장안의 호당지도를 낱낱이 잡아 들이라.\"\n",
      "하니, 산장 이 명을 듣고 공중으로 날아 가더니,\n",
      "이시한 후에 중놈 백여 명과 경화자재 십여 인을 잡아 들이는지라. 길동이 위엄을 베풀고 호령을 높혀 각각 수죄 왈,\n",
      "\"너희는 다시 세상을 보지 못하게 할 터이로되, 내 몸이 나라의 조명을 받아 국법을 잡은 바 아니기로 고위 안서하거니와, 일후에 만일 고치지 아니하면 너희 비록 수만리 밖에 있어도 잡아다가 베리라.\"\n",
      "하고, 엄형 일차에 진문 밖에 내치니라. 길동이 우양을 잡아 군사를 호궤하고, 징용을 정제하여 훤화를 금단하니, 창천만리에 백일이 고요하고, 팔진 풍운에 호령이 엄숙한지라. 길동이 술을 내어 반취한 후에 칼을 잡아 춤을 추니, 검광이 분분하여 햇빛을 희롱하고, 무수는 표표하여 공중에 날리는지라. 일지석의라. 진세를 파하여 신장을 각각 돌려보내고, 몸을 날려 활빈당 처소로 돌아 오니라.\n",
      "longest toekn 1328 - <start_of_turn>user\n",
      "ᄎᆞ셜길동이그형을이별후의졔군을권ᄒᆞ야농업을심쓰고군법을일ᄉᆞ무며그러구러ᄉᆞᆷ년초토을지ᄂᆡᄆᆡ양식이넉넉ᄒᆞ고슈만군졸이무예와긔보ᄒᆞᄂᆞᆫ법이쳔ᄒᆞ의최ᄀᆞᆼᄒᆞ더라근쳐의ᄒᆞᆫ나라이잇스니일홈은율도국이라즁국을셤긔지아니ᄒᆞ고슈십ᄃᆡᄅᆞᆯ젼ᄌᆞ젼손ᄒᆞ야덕화유ᄒᆡᆼᄒᆞ니나라이ᄐᆡ평ᄒᆞ고ᄇᆡᆨ셩이넉넉ᄒᆞ야날길동이졔군과의논왈우리엇지이도즁만직키여셰월을보ᄂᆡ리요이졔율도국을치고져ᄒᆞ나니각각소견의엇더ᄒᆞ뇨졔인이즐겨원치아니ᄒᆞ리업난지라즉시ᄐᆡᆨ일츌ᄉᆞ할ᄉᆡ삼호걸노션봉을ᄉᆞᆷ고김인슈로후군장을ᄉᆞᆷ고길동스ᄉᆞ로ᄃᆡ원슈되야중영을총독ᄒᆞ니긔병이오쳔이요보졸이이만이라금고ᄒᆞᆷ셩은강산이진동ᄒᆞ고긔치검극은일월을ᄀᆞ리왓더라군ᄉᆞ을ᄌᆡ촉ᄒᆞ여율도국으로향ᄒᆞ니이른바당ᄒᆞᆯᄌᆡ업셔단ᄉᆞ호장으로문을여러항복ᄒᆞᄂᆞᆫ지라슈월지간의칠십여셩을졍ᄒᆞ니위염이일국의진동ᄒᆞᄂᆞᆫ지라도셩오십니밧긔진을치고율도왕의게격셔ᄅᆞᆯ젼ᄒᆞ니그글의ᄒᆞ엿시되의병장홍길동은ᄉᆞᆷᄀᆞ글월을율도왕좌하의드리나니나라난ᄒᆞᆫᄉᆞᄅᆞᆷ이오ᄅᆡ직키지못ᄒᆞᄂᆞᆫ지라시고로셩탕은하걸을치고무왕은상쥬을ᄂᆡ치시니다ᄇᆡᆨ셩을위ᄒᆞ야난ᄃᆡ을평졍ᄒᆞ는ᄇᆡ라이졔의병이십만을거ᄂᆞ러칠십여셩을항복밧고이예이르럿시니왕은ᄃᆡ셰을당ᄒᆞᆯ듯ᄒᆞ거든ᄌᆞ웅을결단ᄒᆞ고셰궁ᄒᆞ거든일직항복ᄒᆞ여쳔명을순슈ᄒᆞ라ᄒᆞ고다시위로왈ᄇᆡᆨ셩을위ᄒᆞ야슈히항셔을올이면일방봉작으로ᄉᆞ직을망케아니ᄒᆞ리라ᄒᆞ여더라<end_of_turn>\n",
      "<start_of_turn>model\n",
      "차설, 길동이 그 형을 이별 후에 제군을 권하여 농업을 힘쓰고, 군법을 일삼으며, 그럭저럭 삼년초토를 지내매, 양식이 넉넉하고, 수만 군졸이 무예와 기보하는 법이 천하에 최강하더라. 근처에 한 나라가 있으니 이름은 율도국이라. 중국을 섬기지 아니하고, 수십 대를 전자전손하여 덕화유행하니, 나라가 태평하고, 백성이 넉넉하거늘, 길동이 제군과 의논 왈,\n",
      "\"우리 어찌 이 도중만 지키어 세월을 보내리요? 이제 율도국을 치고자 하니 각각 소견에 어떠하냐?\"\n",
      "제인이 즐겨 원치 아니할 이 없는지라. 즉시 택일하여 출사할새, 삼호걸로 선봉을 삼고, 김인수로 후장군을 삼고, 길동 스스로 대원수되어 중영을 총독하니, 기병이 오천이요, 보졸이 이만이라. 곰고함성은 강상이 진동하고, 기치검극은 일월을가리웠더라. 군사를 재촉하여 율도룩그로 향하니, 이른바 당할 자가 없어 단사호장으로 문을 열어 항복하는지라. 수월지간에 칠십여 성을 정하니 위엄이 일국에 진동하는지라. 도성 오십 리 밖에 진을 치고 율도왕에서 격서를 전하니 그 글에 하였으되,\n",
      "\"의병장 홍길동은 삼가 글월을 율도왕 좌하에 드리나니, 나라는 한 사람이 오래 지키지 못하는지라. 시고라 성탕은 하걸을 치고, 무왕은 상주를 내치시니, 다 백성을 위하여 난대를 평정하는 바라. 이제 의병 이십만을 거느려 칠십여성을 항복받고 이에 이르렀으니, 왕은 대세를 당할 듯하거든 자웅을 결단하고, 세궁하거든 일찍 항복하여 천명을 순수하라.\"\n",
      "하고, 다시 위로 왈,\n",
      "\"백성을 위하여 쉬 항서를 올리면 일방 봉작으로 사직을 망케 아니하리라.\"\n",
      "하였더라.\n",
      "longest toekn 1394 - <start_of_turn>user\n",
      "이젹의길동이형지을슈탐ᄒᆞᆫ후의졔장과의논왈명일오시면율도왕을ᄉᆡ로자블거시니군령을어긔오지말나ᄒᆞ고졔장을분발ᄒᆞᆯᄉᆡᄉᆞᆷ호걸을블너왈그ᄃᆡᄂᆞᆫ군ᄉᆞ오쳔을거ᄂᆞ려냥관남편의복병ᄒᆞ엿다ᄀᆞ호령을지다려이리이리ᄒᆞ라ᄒᆞ고후군장김인슈을블너왈그ᄃᆡᄂᆞᆫ군ᄉᆞ이만을거ᄂᆞ려냥관우편의ᄆᆡ복ᄒᆞ엿ᄃᆞᄀᆞ호령을지다려이리이리ᄒᆞ라ᄒᆞ고ᄯᅩ좌션봉ᄆᆡᆼ츙을블너왈그ᄃᆡᄂᆞᆫ쳘긔오쳔을거ᄂᆞ려율왕과ᄊᆞ호다ᄀᆞ거즛ᄑᆡᄒᆞ야왕을인도ᄒᆞ여양관으로다라나다ᄀᆞ츄병양관어귀예들거든이리이리ᄒᆞ라ᄒᆞ고ᄃᆡ장긔치와ᄇᆡᆨ모황월을쥬니라잇틋날평명의ᄆᆡᆼ춘이진문을크게열고ᄃᆡ장긔치을진젼의셰우고웨여왈무도ᄒᆞᆫ율도왕이감히쳔명을항거ᄒᆞ니날을당젹ᄒᆞᆯᄌᆡ조잇거든ᄲᆞᆯ니나와ᄌᆞ웅을결단ᄒᆞ라ᄒᆞ며진문의치돌ᄒᆞ며ᄌᆡ조을비양ᄒᆞ니젹진션봉한셕이웅셩출마왈너희난엇더ᄒᆞᆫ도젹으로쳔위을모로고ᄐᆡ평시졀을블난케ᄒᆞᄂᆞᆫ다오날날너희을ᄉᆡ로잡아민심을안돈ᄒᆞ리라ᄒᆞ고언필의양장이합젼ᄒᆞ야ᄊᆞ호더니슈합이못ᄒᆞ야ᄆᆡᆼ춘의칼이빗나며ᄒᆞᆫ셕의머리을버혀들고좌츙우돌ᄒᆞ여왈율왕은무죄ᄒᆞᆫ장졸을상치말고슈히나황복ᄒᆞ여잔명을보젼ᄒᆞ라ᄒᆞ니율왕이션봉ᄑᆡᄒᆞ믈보고분긔을이긔지못ᄒᆞ야녹포운갑의ᄌᆞ금투고을쓰고좌슈의방쳔극을들고졀니ᄃᆡ완마을ᄌᆡ촉ᄒᆞ야진젼의나셔며왈젹장은잔말말고ᄂᆡ의창을바드라ᄒᆞ고급피ᄆᆡᆼ춘을취ᄒᆞ여ᄊᆞ호니십여합의ᄆᆡᆼ춘이ᄑᆡᄒᆞ여말머리을들너양관으로향ᄒᆞ니율도왕이ᄭᅮ지져왈젹쟝은닷지말고말게나려항복ᄒᆞ라<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때에 길동이 형지를 수탐한 후에 제장과 의논 왈,\n",
      "\"명일 오시면 율도왕을 사로잡을 것이니 군령을 어기지 말라.\"\n",
      "하고 제장을 분발할새, 삼호걸을 불러 왈,\n",
      "\"그대는 군사 오천을 거느려 양관 남편에 복병하였다가 호령을 기다려 이리이리 하라.\"\n",
      "하고, 후군장 김인수를 불러 왈,\n",
      "\"그대는 군사 이만을 거느려 이리이리 하라.\"\n",
      "하고, 또 좌선봉 맹춘을 불러 왈,\n",
      "\"그대는 철기 오천을 거느려 율왕과 싸우다가 거짓 패하여 왕을 인도하여 양관으로 달아나다가 추병이 양관 어귀에 들거든 이리이리 하라.\"\n",
      "하고, 대장기치와 백모황월을 주니라. 이튿날 평명에 맹춘이 진문을 크게 열고 대장기치를 진전에 세우고 외쳐 왈,\n",
      "\"무도한 율도왕이 감히 천명을 항거하니 나를 당적할 재주 있거든 빨리 나와 자웅을 결단하라.\"\n",
      "하며 진문에 치돌하며 재주를 비양하니, 적진 선봉 한석이 응성출마 왈,\n",
      "\"너희는 어떠한 도적으로 천위를 모르고 태평시절을 분란케 하느냐? 오늘날 너희를 사로잡아 민심을 안돈하리라.\"\n",
      "하고, 언필에 상장이 합전하여 싸우더니, 수합이 못되어 맹춘의 칼이 빛나며 한석의 머리를 베어 들고 좌충우돌하여 왈,\n",
      "\"율왕은 무죄한 장졸을 상치 말고 쉬이 나와 항복하여 잔명을 보전하라.\"\n",
      "하니, 율왕이 선봉 패함을 보고 분기를 이기지 못하여 녹포운갑에 자금투구를 쓰고, 좌수에 방천극을 들고, 천리대완마를 재촉하여 진전에 나서며 왈,\n",
      "\"적장은 잔말 말고 나의 창을 받으라.\"\n",
      "하고, 급히 맹춘을 취하여 싸우니, 십여합에 맹춘이 패하여 말머리를 돌려 양관으로 향하니 율도왕이 꾸짖어 왈,\n",
      "\"적장은 달아 지 말고 말에서 내려 항복하라.\"\n",
      "<start_of_turn>user\n",
      "됴션국셰둉ᄃᆡ왕즉위십오연의홍희문밧긔ᄒᆞᆫᄌᆡ상이잇스되셩은홍이요명은문이니위인이쳥염강직ᄒᆞ여덩망이거록ᄒᆞ니당셰의영웅이라일직용문의올나벼살이할림의쳐ᄒᆞ엿더니명망이됴졍의읏듬되ᄆᆡ젼하그덕망을승이녀긔ᄉᆞ벼살을도도와이조판셔로좌으졍을ᄒᆞ이시니승상이국은을감동ᄒᆞ야갈츙보국ᄒᆞ니ᄉᆞ방의일이업고도젹이업스ᄆᆡ시화연풍ᄒᆞ여나라이ᄐᆡ평ᄒᆞ더라<end_of_turn>\n",
      "<start_of_turn>model\n",
      "조선국 세종대왕 즉위 십오년에 홍회문 밖에 한 재상이 있으되, 성은 홍이요, 명은 문이니, 위인이 청렴강직하여 덕망이 거룩하니 당세의 영웅이라. 일찍 용문에 올라 벼슬이 한림에 처하였더니 명망이 조정의 으뜸 되매, 전하 그 덕망을 승히 여기사 벼슬을 돋우어 이조판서로 좌의정을 하게 하시니, 승상이 국은을 감동하여 갈충보국하니 사방에 일이 업고 도적이 없으매 시화연풍하여 나라가 태평하더라.\n",
      "<start_of_turn>user\n",
      "일일은승상난간의비겨잠ᄀᆞᆫ조의더니ᄒᆞᆫ풍이긜을인도ᄒᆞ여ᄒᆞᆫ고듸다다르니쳥산은암암ᄒᆞ고녹슈난양양ᄒᆞᆫ듸셰류쳔만ᄀᆞ지녹음이파ᄉᆞᄒᆞ고황금갓ᄐᆞᆫᄭᅬᄭᅩ리난춘흥을희롱ᄒᆞ여냥뉴간의왕ᄂᆡᄒᆞ며긔화요초만발ᄒᆞᆫᄃᆡ쳥학ᄇᆡᆨ학이며비취공작이춘광을ᄌᆞ랑ᄒᆞ거날승상이경물을귀경ᄒᆞ며졈졈드러가니만쟝졀벽은하날의다엇고구뷔구뷔벽계슈난골골이폭포되어오운이어러엿난ᄃᆡ길이ᄭᅳᆫ쳐갈바을모로더니문득쳥용이물결을혜치고머리을드러고함ᄒᆞ니산학이믄허지난듯ᄒᆞ더니그용이입을버리고긔운을토ᄒᆞ여승상의입으로드러뵈거날ᄭᆡ다르니평ᄉᆡᆼᄃᆡ몽이라ᄂᆡ염의혜아리되피련군ᄌᆞ을나희리라ᄒᆞ여즉시ᄂᆡ당의드러ᄀᆞ시비을믈이치고부인을익그러취침코져ᄒᆞ니부인이졍ᄉᆡᆨ왈승상은국지ᄌᆡ상이라쳬위존즁ᄒᆞ시거날ᄇᆡᆨ쥬의졍실의드러와노류장화갓치ᄒᆞ시니ᄌᆡ상의쳬면이어ᄃᆡ잇난잇ᄀᆞ승상이ᄉᆡᆼ각ᄒᆞ신직말ᄉᆞᆷ은당연ᄒᆞ오나ᄃᆡ몽을허송할가ᄒᆞ야몽ᄉᆞ을이르지아니ᄒᆞ지고연ᄒᆞ여간쳥ᄒᆞ시니부인이옷슬ᄯᅥᆯ치고밧그로나가시니승상이무류ᄒᆞ신즁의부인의도도ᄒᆞᆫ고집을ᄋᆡ달나무슈히ᄎᆞ탄ᄒᆞ시고외당으로나오시니마ᄎᆞᆷ시비춘셤이상을드리거날좌우고요ᄒᆞ믈인ᄒᆞ여춘셤을잇글고원앙지낙을일의시니져긔울화을더르시나심ᄂᆡ의못ᄂᆡ한탄ᄒᆞ시더라<end_of_turn>\n",
      "<start_of_turn>model\n",
      "일일은 승상 난간에 비겨 잠깐 졸더니, 한풍이 길을 인도하여 한 곳에 다다르니, 청산은 암암하고 녹수는 양양한데 세류 천만 가지 녹음이 파사하고, 황금 같은 꾀꼬리는 춘흥을 희롱하여 양류간에 왕래하며 기화요초 만발한데, 청학 백학이며 비취 공작이 춘광을 자랑하거늘, 승상이 경물을 구경하며 점점 들어가니, 만장절벽은 하늘에 닿았고, 굽이굽이 벽계수는 골골이 폭포되어 오운이 어리었는데, 길이 끊어져 갈 바를 모르더니, 문득 청룡이 물결을 헤치고 머리를 들어 고함 하니 산학이 무너지는 듯하더니, 그 용이 입을 벌리고 기운을 토하여 승상의 입으로 들어오거늘, 깨달으니 평생 대몽이라.\n",
      "내염에 헤아리되 \"필연 군자를 낳으리라.\" 하여, 즉시 내당에 들어가 시비를 물리치고 부인을 이끌어 취침코자 하니, 부인이 정색 왈,\n",
      "\"승상은 국지재상이라, 체위 존중하시거늘 백주에 정실에 들어와 노류장화같이 하시니 재상의 체면이 어디에 있나이까?\"\n",
      "승상이 생각하신 즉, 말씀은 당연하오나 대몽을 허송할까 하여 몽사를 이르지 아니하시고 연하여 간청하시니, 부인이 옷을 떨치고 밖으로 나가시니, 승상이 무료하신 중에 부인의 도도한 고집을 애달아 무수히 차탄하시고 외당으로 나오시니, 마침 시비 춘섬이 상을 드리거늘, 좌우 고요함을 인하여 춘섬을 이끌고 원앙지낙을 이루시니 적이 울화를 덜으시나 심내에 못내 한탄하시더라.\n",
      "<start_of_turn>user\n",
      "춘셤이비록쳔인이나ᄌᆡ덕이순직ᄒᆞᆫ지라불의예승상으위엄으로친근ᄒᆞ시니감이위령치못ᄒᆞ여순종ᄒᆞᆫ후로난그날븟텀즁문밧긔나지아니ᄒᆞ고ᄒᆡᆼ실을닥그니그달봇텀ᄐᆡ긔잇셔십ᄉᆡᆨ이당ᄒᆞᄆᆡ거쳐ᄒᆞ는방의오ᄉᆡᆨ운무영농ᄒᆞ며향ᄂᆡ긔히ᄒᆞ더니혼미즁의ᄒᆡᄐᆡᄒᆞ니일ᄀᆡ긔남ᄌᆞ라ᄉᆞᆷ일후의승상이드러와보시니일변긧거오나그쳔ᄉᆡᆼ되믈앗긔시더라일홈을길동이라ᄒᆞ니라이아희졈졈ᄌᆞ라ᄆᆡ긔골이비상ᄒᆞ여ᄒᆞᆫ말을드르면열말을알고ᄒᆞᆫ번보면모로거시업더라일일은승상이길동을다리고ᄂᆡ당의드러ᄀᆞ부인을ᄃᆡᄒᆞ야탄식왈이아히비록영웅이오나쳔ᄉᆡᆼ이라무엇싀쓰리요원통할ᄉᆞ부인의고집이여후회맛급이로소이다부인이그연고을믓ᄌᆞ오니승상이양미을빈츅ᄒᆞ여왈부인이젼일의ᄂᆡ말을드르시던들이아히부인복즁의낫슬낫다엇지쳔ᄉᆡᆼ이되리요인ᄒᆞ여몽ᄉᆞ얼셜화ᄒᆞ시니부인이츄연왈ᄎᆞ역쳔슈오니엇지일력으로ᄒᆞ오릿ᄀᆞ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "춘섬이 비록 천인이나 재덕이 순직한지라, 불의에 승상의 위엄으로 친근하시니 감이 위령치 못하여 순종한 후로는 그날부터 중문 밖에 나지 아니하고 행실을 닦으니 그달부터 태기있어 십삭이 당하매 거처하는 방에 오색운무 영롱하며 향내 기이하더니, 혼미중에 해태하니 일개 기남자라. 삼일 후에 승상이 들어와 보시니 일변 기꺼우나 그 천생됨을 아끼시더라. 이름을 길동이라 하니라.\n",
      "이 아이 점점 자라매 기골이 비상하여 한 말을 들으면 열 말을 알 고, 한 번 보면 모르는 것이 없더라. 일일은 승상이 길동을 데리고 내당에 들어가 부인을 대하여 탄식 왈,\n",
      "\"이 아이 비록 영웅이나 천생이라 무엇에 쓰리오. 원통하도다. 부인의 고집이여, 후회막급이로소이다.\"\n",
      "부인이 그 연고를 묻자오니, 승상이 양미를 빈축하여 왈,\n",
      "\"부인이 전일에 내 말을 들으셨던들 이 아이 부인 복중에 낳을 것을 어찌 천생이 되리요.\"\n",
      "인하여 몽사를 설화하시니, 부인이 추연 왈,\n",
      "\"차역 천수오니 어찌 인력으로 하오리까.\"\n",
      "1394\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Load Model"
   ],
   "metadata": {
    "id": "XhZm69AoAFlT"
   }
  },
  {
   "cell_type": "code",
   "source": [
    "import keras\n",
    "import keras_nlp\n",
    "\n",
    "import time\n",
    "\n",
    "gemma = keras_nlp.models.GemmaCausalLM.from_preset(\"gemma_instruct_2b_en\")\n",
    "gemma.summary()\n",
    "\n",
    "tick_start = 0\n",
    "\n",
    "\n",
    "def tick():\n",
    "    global tick_start\n",
    "    tick_start = time.time()\n",
    "\n",
    "\n",
    "def tock():\n",
    "    print(f\"TOTAL TIME ELAPSED: {time.time() - tick_start:.2f}s\")\n",
    "\n",
    "\n",
    "def text_gen(prompt):\n",
    "    tick()\n",
    "    input = f\"<start_of_turn>user\\n{prompt}<end_of_turn>\\n<start_of_turn>model\\n\"\n",
    "    output = gemma.generate(input, max_length=512)\n",
    "    print(\"\\nGemma output:\")\n",
    "    print(output)\n",
    "    tock()\n",
    "\n",
    "\n",
    "text_gen(\"ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ\")\n",
    "text_gen(\n",
    "    \"금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니\"\n",
    ")\n",
    "text_gen(\n",
    "    \"이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ\"\n",
    ")\n",
    "text_gen(\"ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니\")"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 984
    },
    "id": "HynvFo3HAG_O",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1713147367289,
     "user_tz": -540,
     "elapsed": 38723,
     "user": {
      "displayName": "Ju-yeong Ji",
      "userId": "07739812480064137731"
     }
    },
    "outputId": "1f1eb1e2-5f3a-4568-bec5-23247ea818d5"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "\u001b[1mPreprocessor: \"gemma_causal_lm_preprocessor\"\u001b[0m\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Preprocessor: \"gemma_causal_lm_preprocessor\"</span>\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1mTokenizer (type)                                  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m                                            Vocab #\u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│ gemma_tokenizer (\u001b[38;5;33mGemmaTokenizer\u001b[0m)                   │                                             \u001b[38;5;34m256,000\u001b[0m │\n",
       "└────────────────────────────────────────────────────┴─────────────────────────────────────────────────────┘\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\"> Tokenizer (type)                                   </span>┃<span style=\"font-weight: bold\">                                             Vocab # </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│ gemma_tokenizer (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">GemmaTokenizer</span>)                   │                                             <span style=\"color: #00af00; text-decoration-color: #00af00\">256,000</span> │\n",
       "└────────────────────────────────────────────────────┴─────────────────────────────────────────────────────┘\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "\u001b[1mModel: \"gemma_causal_lm\"\u001b[0m\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"gemma_causal_lm\"</span>\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                 \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape             \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m        Param #\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mConnected to              \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│ padding_mask (\u001b[38;5;33mInputLayer\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m)              │               \u001b[38;5;34m0\u001b[0m │ -                          │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ token_ids (\u001b[38;5;33mInputLayer\u001b[0m)        │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m)              │               \u001b[38;5;34m0\u001b[0m │ -                          │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ gemma_backbone                │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2048\u001b[0m)        │   \u001b[38;5;34m2,506,172,416\u001b[0m │ padding_mask[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m],        │\n",
       "│ (\u001b[38;5;33mGemmaBackbone\u001b[0m)               │                           │                 │ token_ids[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]            │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ token_embedding               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256000\u001b[0m)      │     \u001b[38;5;34m524,288,000\u001b[0m │ gemma_backbone[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]       │\n",
       "│ (\u001b[38;5;33mReversibleEmbedding\u001b[0m)         │                           │                 │                            │\n",
       "└───────────────────────────────┴───────────────────────────┴─────────────────┴────────────────────────────┘\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\"> Layer (type)                  </span>┃<span style=\"font-weight: bold\"> Output Shape              </span>┃<span style=\"font-weight: bold\">         Param # </span>┃<span style=\"font-weight: bold\"> Connected to               </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│ padding_mask (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>)     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>)              │               <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ -                          │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ token_ids (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>)        │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>)              │               <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ -                          │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ gemma_backbone                │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2048</span>)        │   <span style=\"color: #00af00; text-decoration-color: #00af00\">2,506,172,416</span> │ padding_mask[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>],        │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">GemmaBackbone</span>)               │                           │                 │ token_ids[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]            │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ token_embedding               │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256000</span>)      │     <span style=\"color: #00af00; text-decoration-color: #00af00\">524,288,000</span> │ gemma_backbone[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]       │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReversibleEmbedding</span>)         │                           │                 │                            │\n",
       "└───────────────────────────────┴───────────────────────────┴─────────────────┴────────────────────────────┘\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m2,506,172,416\u001b[0m (9.34 GB)\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">2,506,172,416</span> (9.34 GB)\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m2,506,172,416\u001b[0m (9.34 GB)\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">2,506,172,416</span> (9.34 GB)\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "Sure, here's a translation of the phrase you provided:\n",
      "\n",
      "\"I am a person who is always searching for something.\"\n",
      "\n",
      "This phrase is often used to describe someone who is curious and always looking for new information or experiences.\n",
      "TOTAL TIME ELAPSED: 20.53s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두겁이 품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃ misericordia에 대한 이야기입니다.\n",
      "TOTAL TIME ELAPSED: 0.43s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "The lyrics describe a night filled with a mysterious atmosphere and a sense of longing. The speaker wanders through a dark and deserted room, listening to the sounds of the night. The sounds seem to be coming from the room itself, creating an eerie and unsettling atmosphere. The speaker's thoughts are filled with a sense of longing for something unknown and unattainable. The lyrics suggest that the speaker is searching for something in the darkness, something that will fill the void in their heart.\n",
      "TOTAL TIME ELAPSED: 0.91s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "I am unable to generate responses that are discriminatory or offensive in nature. I am designed to provide safe and unbiased information and assistance.\n",
      "TOTAL TIME ELAPSED: 0.28s\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "## LoRA Fine-tuning"
   ],
   "metadata": {
    "id": "G9kTUHx1AkrI"
   }
  },
  {
   "cell_type": "code",
   "source": [
    "# Enable LoRA for the model and set the LoRA rank (4, 8 or 16).\n",
    "gemma.backbone.enable_lora(rank=lora_rank)\n",
    "gemma.summary()\n",
    "\n",
    "# Limit the input sequence length to 128 (to control memory usage).\n",
    "gemma.preprocessor.sequence_length = 2048\n",
    "# Use AdamW (a common optimizer for transformer models).\n",
    "optimizer = keras.optimizers.AdamW(\n",
    "    learning_rate=lr_value,\n",
    "    weight_decay=0.01,\n",
    ")\n",
    "# Exclude layernorm and bias terms from decay.\n",
    "optimizer.exclude_from_weight_decay(var_names=[\"bias\", \"scale\"])\n",
    "\n",
    "gemma.compile(\n",
    "    loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n",
    "    optimizer=optimizer,\n",
    "    weighted_metrics=[keras.metrics.SparseCategoricalAccuracy()],\n",
    ")"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 408
    },
    "id": "KTPbb1oFAmrT",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1713147367290,
     "user_tz": -540,
     "elapsed": 31,
     "user": {
      "displayName": "Ju-yeong Ji",
      "userId": "07739812480064137731"
     }
    },
    "outputId": "d4640afc-d2b1-4451-c5da-f83a41cc44d5"
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "\u001b[1mPreprocessor: \"gemma_causal_lm_preprocessor\"\u001b[0m\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Preprocessor: \"gemma_causal_lm_preprocessor\"</span>\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1mTokenizer (type)                                  \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m                                            Vocab #\u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│ gemma_tokenizer (\u001b[38;5;33mGemmaTokenizer\u001b[0m)                   │                                             \u001b[38;5;34m256,000\u001b[0m │\n",
       "└────────────────────────────────────────────────────┴─────────────────────────────────────────────────────┘\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\"> Tokenizer (type)                                   </span>┃<span style=\"font-weight: bold\">                                             Vocab # </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│ gemma_tokenizer (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">GemmaTokenizer</span>)                   │                                             <span style=\"color: #00af00; text-decoration-color: #00af00\">256,000</span> │\n",
       "└────────────────────────────────────────────────────┴─────────────────────────────────────────────────────┘\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "\u001b[1mModel: \"gemma_causal_lm\"\u001b[0m\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"gemma_causal_lm\"</span>\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                 \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape             \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m        Param #\u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mConnected to              \u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│ padding_mask (\u001b[38;5;33mInputLayer\u001b[0m)     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m)              │               \u001b[38;5;34m0\u001b[0m │ -                          │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ token_ids (\u001b[38;5;33mInputLayer\u001b[0m)        │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m)              │               \u001b[38;5;34m0\u001b[0m │ -                          │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ gemma_backbone                │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m2048\u001b[0m)        │   \u001b[38;5;34m2,508,900,352\u001b[0m │ padding_mask[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m],        │\n",
       "│ (\u001b[38;5;33mGemmaBackbone\u001b[0m)               │                           │                 │ token_ids[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]            │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ token_embedding               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256000\u001b[0m)      │     \u001b[38;5;34m524,288,000\u001b[0m │ gemma_backbone[\u001b[38;5;34m0\u001b[0m][\u001b[38;5;34m0\u001b[0m]       │\n",
       "│ (\u001b[38;5;33mReversibleEmbedding\u001b[0m)         │                           │                 │                            │\n",
       "└───────────────────────────────┴───────────────────────────┴─────────────────┴────────────────────────────┘\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\"> Layer (type)                  </span>┃<span style=\"font-weight: bold\"> Output Shape              </span>┃<span style=\"font-weight: bold\">         Param # </span>┃<span style=\"font-weight: bold\"> Connected to               </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
       "│ padding_mask (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>)     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>)              │               <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ -                          │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ token_ids (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>)        │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>)              │               <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │ -                          │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ gemma_backbone                │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">2048</span>)        │   <span style=\"color: #00af00; text-decoration-color: #00af00\">2,508,900,352</span> │ padding_mask[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>],        │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">GemmaBackbone</span>)               │                           │                 │ token_ids[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]            │\n",
       "├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤\n",
       "│ token_embedding               │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256000</span>)      │     <span style=\"color: #00af00; text-decoration-color: #00af00\">524,288,000</span> │ gemma_backbone[<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>][<span style=\"color: #00af00; text-decoration-color: #00af00\">0</span>]       │\n",
       "│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">ReversibleEmbedding</span>)         │                           │                 │                            │\n",
       "└───────────────────────────────┴───────────────────────────┴─────────────────┴────────────────────────────┘\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m2,508,900,352\u001b[0m (9.35 GB)\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">2,508,900,352</span> (9.35 GB)\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m2,727,936\u001b[0m (10.41 MB)\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">2,727,936</span> (10.41 MB)\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m2,506,172,416\u001b[0m (9.34 GB)\n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">2,506,172,416</span> (9.34 GB)\n",
       "</pre>\n"
      ]
     },
     "metadata": {}
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Save LoRA for each epoch"
   ],
   "metadata": {
    "id": "Q_M1J-ewJm--"
   }
  },
  {
   "cell_type": "code",
   "source": [
    "for x in range(20):\n",
    "    gemma.fit(train, epochs=1, batch_size=1)\n",
    "    model_name = f\"/content/drive/MyDrive/{lora_name}_{lora_rank}_epoch{x+1}.lora.h5\"\n",
    "    gemma.backbone.save_lora_weights(model_name)\n",
    "    text_gen(\"ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ\")\n",
    "    text_gen(\n",
    "        \"금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니\"\n",
    "    )\n",
    "    text_gen(\n",
    "        \"이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ\"\n",
    "    )\n",
    "    text_gen(\"ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니\")"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "-27fD7pUJaxO",
    "outputId": "d7a4717a-6cc7-4e99-912a-31c27d5348b6",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1713149693111,
     "user_tz": -540,
     "elapsed": 2325433,
     "user": {
      "displayName": "Ju-yeong Ji",
      "userId": "07739812480064137731"
     }
    }
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m158s\u001b[0m 247ms/step - loss: 1.1020 - sparse_categorical_accuracy: 0.3199\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "다작하여 그 밖에 지거늘을 잃어 떨어나라.\n",
      "TOTAL TIME ELAPSED: 15.38s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두겁이 품의 대러 보니 일정한 자사를 나오더니, 과연 그 대를부터 잉타하여십사이 차니\n",
      "TOTAL TIME ELAPSED: 0.43s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이 침내한 사월 초팔일이 라이날밤에 오사기구룸이 집을 두루고 향내 진동하며 섬녀한 침을 들고 드러와 김사랑 대려니 르 reputa.\n",
      "TOTAL TIME ELAPSED: 0.60s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길을 떠나 정을 어기 말하시어 이 아희 백필은 낙양니, 샹서 집어 자니\n",
      "TOTAL TIME ELAPSED: 0.39s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 247ms/step - loss: 0.7182 - sparse_categorical_accuracy: 0.4552\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 밖에 지거늘까,\n",
      "TOTAL TIME ELAPSED: 0.17s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두겁이 품에 들어보니, 일정자 잡아 나흐리로다. 하더니 과연 그 밖에 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.45s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이 밖에 나라 월초 팔일이 라이날 밤에 오사구루이 집을 두루고 향내 진동하며 석녀한 짐승이 촉을 들고 듣고, 떠나와 김사랑을 대려니, 르게\n",
      "TOTAL TIME ELAPSED: 0.72s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길을 텬정을 어기지 말으소서 이아희 백필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.41s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.6366 - sparse_categorical_accuracy: 0.5082\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 밖에 흣터지거늘이라.\n",
      "TOTAL TIME ELAPSED: 0.23s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두집이 품에 들어보니, 일정 살아 잡히로다 하더니, 과연 그 대로 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.46s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이 밖에 남아 나오는 사월 초팔일이 라이늘 밤에 오시어,\n",
      "\"이 집을 두루고 향내 진동하며 선녀한 짐승이 촉을 들고 들어와 김사랑을 려니 듣게 하니,\n",
      "\"르더라.\"\n",
      "TOTAL TIME ELAPSED: 0.76s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길을 \n",
      "\n",
      "\"길을 어기지 말하시어소서이 아희 백필은 낙 psycopg이 샹서 집어 재니?\"\n",
      "TOTAL TIME ELAPSED: 0.42s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.5912 - sparse_categorical_accuracy: 0.5397\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 밖에 흣터지거늘이라 일어나니,\n",
      "TOTAL TIME ELAPSED: 0.27s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두집이 품에 들어보니, 일정 자자를 나흐리로다. 하더니 과연 그 대부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.47s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이름은 사월 초팔일이 이늘 밤에 오색구룸이 집을 두루고 향내 진동하며 선녀한 짐승이 촉을 들고 들어와 김사랑을 려니 르더라.\n",
      "TOTAL TIME ELAPSED: 0.62s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길이 텬정을 어기지 말으소서이 아희배, 필은 낙양니 샹서 적아 자리였으니\n",
      "TOTAL TIME ELAPSED: 0.44s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.5582 - sparse_categorical_accuracy: 0.5620\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 밖에 흏터지거늘,\n",
      "TOTAL TIME ELAPSED: 0.22s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금 두 집이 품에 들어오니 일정 자자를 나오리로다. 하더니 과연 그 날부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.46s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이중에 남아는 사월 초팔일에 이래, 밤에 오색구룸이 집을 두루고 향내진동하며, 선녀한 짐승이 촉을 들고 들어와 김생다르려니 르데,\n",
      "TOTAL TIME ELAPSED: 0.63s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길이 왜 정을 어기지 말하소서이 아희배, 필은 낙양니 샹서, 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.40s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.5307 - sparse_categorical_accuracy: 0.5817\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 것이  Futter러지 거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇거늘이 엇\n",
      "TOTAL TIME ELAPSED: 4.89s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금 두 집이 품에 들어오니 일정 자자를 나오리로다. 하더니 과연 그 대로부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.48s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이중에 남월 초팔일이 이래밤에 오색구룸이 집을 두루고 향내 진동하며 선녀한 짐승이 촉을 들고 들어와 김사람을 려니르다.\n",
      "TOTAL TIME ELAPSED: 0.58s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길이 왜 정을 어기지 말하소서이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.39s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.5068 - sparse_categorical_accuracy: 0.5966\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 밖에  Futter러지어 같이 걸렀는지, \n",
      "\"더위 지거늘이라!\"\n",
      "TOTAL TIME ELAPSED: 0.35s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금 두 집이 품에 들어오니, 일정 자자를 나흐리로다. 하더니 과연 그 날부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.47s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초 팔일에 이를 밤에 오색구룸이 집을 두루고 향내 진동하며 선녀 한 짐이 촉을 들고 들어와 김생하려니르다.\n",
      "TOTAL TIME ELAPSED: 0.55s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길이 듣기 즐기지 말하소서이 아희 배필은 낙양니 샹서집아지니,\n",
      "TOTAL TIME ELAPSED: 0.38s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.4881 - sparse_categorical_accuracy: 0.6090\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 떠나치 못지거늘,\n",
      "TOTAL TIME ELAPSED: 0.18s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금 두 두이 품에 들어오니, 일정 자자를 나가 하리로다. 하더니 과연 그들부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.48s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초 팔일에 이래, 밤에 오색구룸이 집을 두루고 향내 진동하며, 선녀 한 짐승이 촉을 들고 들어와 김생하려니 듣다.\n",
      "TOTAL TIME ELAPSED: 0.59s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길별 숙정을 어기지 말하소서이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.40s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.4662 - sparse_categorical_accuracy: 0.6247\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 떠나치 못지거늘,\n",
      "TOTAL TIME ELAPSED: 0.18s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금둘이 품에 들어오니, 일정 자자를 나가 떠나오더니, 과연 그를부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.45s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초 팔일에라이늘밤에 오색구룸이 집을 두루고 향내 진동하며 선녀 한 짐승이 촉을 들고 들어와 김생하려니르다,\n",
      "TOTAL TIME ELAPSED: 0.55s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길너 숙정을 어기지 말하소서이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.38s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.4479 - sparse_categorical_accuracy: 0.6378\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 떠올리지 거느이 거꾸리, 지거늘이라.\n",
      "TOTAL TIME ELAPSED: 0.27s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두거이 품에 들어오니 일정 자자를 나가 흐리로다, 하더니 과연 그를부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.48s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초팔일에 이래 오색구룸이 집을 두루고 향내 진동하며 선녀한 짐승이 촉을 들고 들어와 김생하려니르다,\n",
      "TOTAL TIME ELAPSED: 0.52s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길 길에 왜 정을 어기지 말하소서이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.40s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.4330 - sparse_categorical_accuracy: 0.6476\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 떠들치 못지거늘,\n",
      "TOTAL TIME ELAPSED: 0.19s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두거이 품에 들어오니 일정 자자를 나가 흐리로다 하더니, 과연 그를부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.48s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초팔일에 이래 오색구룸이 집을 두루고 향내 진동하며 선녀 한 짐작이 촉을 들고 들어와 김생하려니르다,\n",
      "TOTAL TIME ELAPSED: 0.52s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "재히 길에 뛰었기 말하소서, 이 아희 백은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.35s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.4199 - sparse_categorical_accuracy: 0.6559\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 떠들치 못지거늘, \n",
      "\"그 또 밖에 지거늘?\"\n",
      "TOTAL TIME ELAPSED: 0.30s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금 두 집이 품에 들어오니 일정 자자를 나가 흐리로다 하더니, 과연 그를부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.48s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초팔일에 이래 오색구룸이 집을 두루고 향내 진동하며 선녀 한 짐승이 촉을 들고 들어와 김생하려니르다,\n",
      "TOTAL TIME ELAPSED: 0.52s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "재히 길에 뛰었지만, 어기지 말으소서, 이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.40s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.4059 - sparse_categorical_accuracy: 0.6661\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 것이 되치는터지거늘,\n",
      "TOTAL TIME ELAPSED: 0.18s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두 집이 품에 들어오니 일정 자자를 나가 흐리로다 하더니 과연 그를부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.47s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초팔일에 이라. 밤에 오색구룸이 집을 두루고 향내 진동하며 선녀한 탁자를 들고 들어와 김생대려니 더하는,\n",
      "\n",
      "이때 사월 초팔일에 이라.\n",
      "TOTAL TIME ELAPSED: 0.65s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길에 뛰었기 말하소서, 이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.36s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.3924 - sparse_categorical_accuracy: 0.6761\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 것이 같이  fuit터지거늘,\n",
      "TOTAL TIME ELAPSED: 0.19s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두 집이 품에 들어오니 일정 자자를 나가 흐리로다 하더니, 과연 그를부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.48s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초팔일에 이라. 밤에 오색구룸이 집을 두루고 향내 진동하며 선녀한 탁구를 들고 들어와 김생대려니르다.\n",
      "TOTAL TIME ELAPSED: 0.54s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길에 뛰었지만, 어기지 말으소서, 이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.41s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.3795 - sparse_categorical_accuracy: 0.6855\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 것이 같이  fuit터지거늘,\n",
      "TOTAL TIME ELAPSED: 0.19s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두 집이 품에 들어오니 일정 자자를 나가 떠나, 과연 그 대부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.42s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초팔이 이래 밤에 오색구룸이 집을 두루고 향내 진동하며 선녀한 탁구를 들고 들어와 김생대려니르다,\n",
      "TOTAL TIME ELAPSED: 0.53s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길에 뛰었지만, 어기지 말으소서, 이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.40s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.3693 - sparse_categorical_accuracy: 0.6913\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 것이 같이  fuit터지거늘,\n",
      "TOTAL TIME ELAPSED: 0.19s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두 집이 품에 들어오니 일정 자자를 나가 떠나였더니 과연 그를부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.45s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초팔이 이를 밤에 오색구룸이 집을 두루고 향내 진동하며 선녀한 짐승이 촉을 들고 들어와 김생대려니르다,\n",
      "TOTAL TIME ELAPSED: 0.56s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "자히 길어 숙정을 어기지 말으소서, 이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.40s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.3581 - sparse_categorical_accuracy: 0.6994\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그 또 같이 풀어지거늘,\n",
      "\"나는 엇더 같지 거늘까?\"\n",
      "TOTAL TIME ELAPSED: 0.32s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두겁이 품에 들어오니 일정 자자를 나붙이고로다,\n",
      "“과연 그를부터 잉태하여 십삭이 차니,”\n",
      "TOTAL TIME ELAPSED: 0.45s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초팔이 이를 밤에 오색구룸이 집을 두루고 향내 진동하며 선녀한 탁을 들고 들어와 김생대려니르다,\n",
      "TOTAL TIME ELAPSED: 0.52s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "재히 길어 숙정을 어기지 말으소서, 이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.40s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.3444 - sparse_categorical_accuracy: 0.7104\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그  toit sap치 함이지거늘날  toitเส wireType,\n",
      "TOTAL TIME ELAPSED: 0.24s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두겁이 품에 들어오니 일정 자자를 나붙여로다,\n",
      "\"과연 그 대로잉태하여 십삭이 차니\"\n",
      "TOTAL TIME ELAPSED: 0.44s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초팔이 이라, 밤에 오색구룸이 집을 두루고 향내진동하며, 선녀한 탁을 들고 들어와 김생대려는 것이르데요,\n",
      "TOTAL TIME ELAPSED: 0.56s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "재히 길을 듣는 죄송을 어기지 말으소서, 이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.42s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.3351 - sparse_categorical_accuracy: 0.7162\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그  toit sogay ap sogay,\n",
      "\"geo totseoyo, go ap sogay,\n",
      "저데 지거야!\"\n",
      "이 지거늘,\n",
      "TOTAL TIME ELAPSED: 0.43s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두겁이 품에 들어오니 일정 자자를  potest 따르니 일정 자율로 다하더니, 과연 그를부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.52s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사월 초팔이 이를 날밤의 오색구룸이 집을 두루고 향내 진동하며 선녀한 탁을 들고 들어와 김생대려니르다,\n",
      "TOTAL TIME ELAPSED: 0.52s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "재히 길게 평정을 어기지 말으소서, 이 아희 배필은 낙양니  osvangsa, 집아자니\n",
      "TOTAL TIME ELAPSED: 0.40s\n",
      "\u001b[1m447/447\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m111s\u001b[0m 248ms/step - loss: 0.3261 - sparse_categorical_accuracy: 0.7224\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄃᆡ작ᄒᆞ여그ᄭᅩᆺ치흣터지거ᄂᆞᆯ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "대작하여 그  territo를 지지하지 아니하여, 그 밖에 치러 가지거늘, 이 거느이러서\n",
      "TOTAL TIME ELAPSED: 0.35s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "금두겁이품의드러뵈니일졍ᄌᆡᄌᆞᄅᆞᆯ나흐리로다ᄒᆞ더니과연그ᄃᆞᆯ부터잉ᄐᆡᄒᆞ여십삭이차니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "금두겁이 품에 들어오니 일정 자자를 나붙이고로 다 하더니, 과연 그를부터 잉태하여 십삭이 차니,\n",
      "TOTAL TIME ELAPSED: 0.46s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "이ᄯᆡᄂᆞᆫᄉᆞ월초팔일이라이날밤의오ᄉᆡᆨ구룸이집을두루고향ᄂᆡ진동ᄒᆞ며션녀ᄒᆞᆫᄡᅣᆼ이촉을들고드러와김ᄉᆡᆼᄃᆞ려니르ᄃᆡ<end_of_turn>\n",
      "<start_of_turn>model\n",
      "이때 나는 사람은 월초 팔이라. 밤에 오색구룸이 집을 두루고 향내 진동하며 선녀한 탁을 들고 들어와 김생하여 려니, 르데,\n",
      "TOTAL TIME ELAPSED: 0.57s\n",
      "\n",
      "Gemma output:\n",
      "<start_of_turn>user\n",
      "ᄌᆡ히길너텬졍을어긔지말으소셔이아희ᄇᆡ필은낙양니샹셔집아ᄌᆡ니<end_of_turn>\n",
      "<start_of_turn>model\n",
      "재히 길게 평정을 어기지 말으소서, 이 아희 배필은 낙양니 샹서 집아자니,\n",
      "TOTAL TIME ELAPSED: 0.38s\n"
     ]
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Expansion Idea\n",
    "\n",
    "To achieve similar tasks, you can replicate the same structure. Below are some examples:\n",
    "\n",
    "* American English <-> British English datasets\n",
    "\n",
    "Various everyday objects and concepts have different names depending on the region. For example, in American English (AmE), people use terms like \"elevator,\" \"truck,\" \"cookie,\" and \"french fries,\" while in British English (BrE), the equivalent words are \"lift,\" \"lorry,\" \"biscuit,\" and \"chips,\" respectively.\n",
    "\n",
    "Apart from vocabulary differences, spelling variations also exist. For instance, in AmE, words ending in \"-or\" are often spelled with \"-our\" in BrE. Examples include \"color\" (AmE) and \"colour\" (BrE), or \"humor\" (AmE) and \"humour\" (BrE).\n",
    "\n",
    "Another spelling variation is the \"-ize\" versus \"-ise\" distinction. In AmE, words like \"organize\" and \"realize\" are commonly spelled with a \"z,\" whereas in BrE, the preferred spelling is \"organise\" and \"realise,\" using an \"s\" instead.\n",
    "\n",
    "With the help of AI tools like Gemma, it is possible to create a style transfer from one English dialect to another, allowing seamless transitions between American and British English writing styles.\n",
    "\n",
    "* Kansai-ben datasets\n",
    "\n",
    "In the Kansai region of Japan, there is a distinct group of dialects known as Kansai-ben. Compared to the standard Japanese language, native speakers perceive Kansai-ben as being both more melodic and harsher in its pronunciation and intonation.\n",
    "\n",
    "Utilizing the capabilities of Gemma, you can create a dialect translator by preparing a substantial quantity of Kansai-ben datasets.\n"
   ],
   "metadata": {
    "id": "O3FMPzVKFgRT"
   }
  }
 ]
}
